home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / LAPBTIME.C < prev    next >
C/C++ Source or Header  |  1989-08-19  |  2KB  |  109 lines

  1. #include "global.h"
  2. #include "mbuf.h"
  3. #include "ax25.h"
  4. #include "timer.h"
  5. #include "lapb.h"
  6.  
  7. static void tx_enq __ARGS((struct ax25_cb *axp));
  8.  
  9. /* Called whenever timer T1 expires */
  10. void
  11. recover(p)
  12. void *p;
  13. {
  14.     register struct ax25_cb *axp;
  15.  
  16.     axp = (struct ax25_cb *)p;
  17.     axp->t1.start *= 2;    /* Back off retransmit timer */
  18.     axp->flags.retrans = 1;
  19.  
  20.     switch(axp->state){
  21.     case SETUP:
  22.         if(axp->n2 != 0 && axp->retries == axp->n2){
  23.             free_q(&axp->txq);
  24.             axp->reason = LB_TIMEOUT;
  25.             lapbstate(axp,DISCONNECTED);
  26.         } else {
  27.             axp->retries++;
  28.             sendctl(axp,COMMAND,SABM|PF);
  29.             start_timer(&axp->t1);
  30.         }
  31.         break;
  32.     case DISCPENDING:
  33.         if(axp->n2 != 0 && axp->retries == axp->n2){
  34.             axp->reason = LB_TIMEOUT;
  35.             lapbstate(axp,DISCONNECTED);
  36.         } else {
  37.             axp->retries++;
  38.             sendctl(axp,COMMAND,DISC|PF);
  39.             start_timer(&axp->t1);
  40.         }
  41.         break;
  42.     case CONNECTED:
  43.         axp->retries = 0;
  44.     case RECOVERY:    /* note fall-thru */
  45.         if(axp->n2 != 0 && axp->retries == axp->n2){
  46.             /* Give up */
  47.             sendctl(axp,RESPONSE,DM|PF);
  48.             free_q(&axp->txq);
  49.             axp->reason = LB_TIMEOUT;
  50.             lapbstate(axp,DISCONNECTED);
  51.         } else {
  52.             /* Transmit poll */
  53.             tx_enq(axp);
  54.             axp->retries++;
  55.             lapbstate(axp,RECOVERY);
  56.         }
  57.         break;
  58.     }
  59. }
  60.  
  61.  
  62. /* Send a poll (S-frame command with the poll bit set) */
  63. void
  64. pollthem(p)
  65. void *p;
  66. {
  67.     register struct ax25_cb *axp;
  68.  
  69.     axp = (struct ax25_cb *)p;
  70.     if(axp->proto == V1)
  71.         return;    /* Not supported in the old protocol */
  72.     switch(axp->state){
  73.     case CONNECTED:
  74.         axp->retries = 0;
  75.         tx_enq(axp);
  76.         lapbstate(axp,RECOVERY);
  77.         break;
  78.     }
  79. }
  80. /* Transmit query */
  81. static void
  82. tx_enq(axp)
  83. register struct ax25_cb *axp;
  84. {
  85.     char ctl;
  86.     struct mbuf *bp;
  87.  
  88.     /* I believe that retransmitting the oldest unacked
  89.      * I-frame tends to give better performance than polling,
  90.      * as long as the frame isn't too "large", because
  91.      * chances are that the I frame got lost anyway.
  92.      * This is an option in LAPB, but not in the official AX.25.
  93.      */
  94.     if(axp->txq != NULLBUF
  95.      && (len_mbuf(axp->txq) < axp->pthresh || axp->proto == V1)){
  96.         /* Retransmit oldest unacked I-frame */
  97.         dup_p(&bp,axp->txq,0,len_mbuf(axp->txq));
  98.         ctl = PF | I | ((axp->vs - axp->unack) & MMASK) << 1
  99.          | axp->vr << 5;
  100.         sendframe(axp,COMMAND,ctl,bp);
  101.     } else {
  102.         ctl = len_mbuf(axp->rxq) >= axp->window ? RNR|PF : RR|PF;    
  103.         sendctl(axp,COMMAND,ctl);
  104.     }
  105.     axp->response = 0;    
  106.     stop_timer(&axp->t3);
  107.     start_timer(&axp->t1);
  108. }
  109.